import "package:flutter/material.dart";
import "package:power_distribution_system/common/system_config.dart";

import "../../common/base_config.dart";
import "../../utils/tools/localstorage_tool.dart";
import "../tools/screenutil_tool.dart";

class CascaderWidget extends StatefulWidget {
  List initAreaData; // 省市区基础数据
  bool updateInTime = true; //是否开启及时更新模式
  Function(List checkedData) onConfirm; // 确认的回调事件

  // 自定义数据结构中的字段。
  // 例：常见的{text:xx,value:xxx,children:xxxx} => {text:xx,code:xxx,options:xxxx}
  Map<String, dynamic> fieldNames = {
    "text": "text",
    "id": "id",
    "children": "children",
    "level": "level"
  };

  /// * 级联选择器
  /// * [initAreaData] List|必填|省市区基础数据
  /// * [fieldNames] Map|fieldNames|选填|自定义数据中的键名
  /// * [onConfirm] func|选填|确认的回调函数|返回值：List
  /// * [updateInTime] bool|选填|是否开启及时更新模式|默认：true
  /// * [waring] 当前只支持3级联动。适用于省市区选择、商品3级分类等等
  CascaderWidget(this.initAreaData,
      {Map fieldNames, Function onConfirm, bool updateInTime, Key key})
      : super(key: key) {
    this.initAreaData = initAreaData;
    this.onConfirm = onConfirm;
    if (fieldNames != null) {
      this.fieldNames = fieldNames;
    }
    if (updateInTime != null) {
      this.updateInTime = updateInTime;
    }
  }

  @override
  CascaderWidgetState createState() => new CascaderWidgetState();
}

class CascaderWidgetState extends State<CascaderWidget>
    with SingleTickerProviderStateMixin {
  bool isLight = true;
  bool flag; // 根据该条件标记选中的样式
  int _tabBarIndex = 0; // TabBar默认选中项

  TabController _tabController; // tabbar控制器
  ScrollController _controller = ScrollController(); // scroll控制器

  // 默认定制选中的省市区数据，用于最后返回
  List<Map<String, dynamic>> checkedArea = [
    {"text": null, "code": null, "index": -1, "level": null},
    {"text": null, "code": null, "index": -1, "level": null},
    {"text": null, "code": null, "index": -1, "level": null},
    {"text": null, "code": null, "index": -1, "level": null}
  ];

  // 存储向上传递的参数，即回调函数中存储的值
  List selectedOptions;

  // 创建tabbar的内容
  List<Tab> _myTabs = <Tab>[
    Tab(text: "请选择"),
    Tab(text: ""),
    Tab(text: ""),
    Tab(text: "")
  ];

  @override
  Widget build(BuildContext context) {
    return Material(
        //color: Colors.white,
        child: SizedBox(
      height: MediaQuery.of(context).size.height * 11.0 / 16.0,
      child: Column(
        children: <Widget>[
          Stack(
            children: <Widget>[
              Container(
                width: double.infinity,
                padding: EdgeInsets.all(ST.setw(30)),
                child: Text(
                  "请选择需要查看的台区地址",
                  style: TextStyle(
                      fontSize: ST.setsp(32), color: SystemConfig.grayColor),
                ),
              ),
              Positioned(
                child: InkWell(
                  onTap: () => {
                    Navigator.pop(context),
                    widget.onConfirm(arrangementData())
                  },
                  child: SizedBox(
                    width: ST.setw(150),
                    child: Container(
                      alignment: Alignment.center,
                      child: Text("确定",
                          style: TextStyle(
                              fontSize: ST.setsp(32),
                              color: SystemConfig.themeColor)),
                    ),
                  ),
                ),
                right: 0,
                top: 0,
                bottom: 0,
              )
            ],
          ),
          Expanded(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Container(
                  width: double.infinity,
                  height: ST.seth(70),
                  child: TabBar(
                    controller: _tabController,
                    isScrollable: true,
                    indicatorSize: TabBarIndicatorSize.label,
                    indicatorColor: SystemConfig.themeColor,
                    unselectedLabelColor: isLight ? Colors.black : Colors.white,
                    labelColor: SystemConfig.themeColor,
                    tabs: _myTabs,
                    onTap: (int index) {
                      setState(() {
                        _tabBarIndex = index;
                        createAreaData();
                      });

                      // 检查及时更新模式是否开启
                      if (widget.updateInTime) {
                        // 根据选中的tabtab清除数据
                        emptyCheckedData(index);
                      }
                    },
                  ),
                ),
                Divider(height: ST.seth(2)),
                Expanded(child: renderProvinceAndCity(context))
              ],
            ),
          ),
        ],
      ),
    ));
  }

  @override
  void initState() {
    super.initState();

    initPage();

    // 确认tabbar的长度（即：item项）
    _tabController = TabController(vsync: this, length: _myTabs.length);
  }

  /// 选中某个tab
  /// * [areaIndex] int|必填|选中的省市区在基础数据中的索引
  /// * [data] Map|必填|省市区基础数据
  void checkedTab(int areaIndex, Map data) {
    setState(() {
      // 存储选中的数据
      checkedArea[_tabBarIndex]["level"] = data[widget.fieldNames["level"]];
      checkedArea[_tabBarIndex]["text"] = data[widget.fieldNames["text"]];
      checkedArea[_tabBarIndex]["code"] = data[widget.fieldNames["id"]];
      checkedArea[_tabBarIndex]["index"] = areaIndex;

      // 将选中的数据作为标题显示
      _myTabs[_tabBarIndex] = Tab(text: data["text"]);

      // 检查当前数据的下级是否存在数据
      if (data["children"].isNotEmpty) {
        // 修改tabbar选中的项下表
        _tabBarIndex = _tabBarIndex + 1;

        // 切换tabbar默认选中项
        _tabController.animateTo(_tabBarIndex);

        // 赋值列表内容
        this.setListAndChangeTab(_tabBarIndex);
      } else {
        // 下级为空，则直接关闭选项
        widget.onConfirm(arrangementData());
        Navigator.pop(context);
      }
    });

//    setState(() {
//      // 存储选中的数据
//      checkedArea[_tabBarIndex]["text"] = data[widget.fieldNames["text"]];
//      checkedArea[_tabBarIndex]["code"] = data[widget.fieldNames["value"]];
//      checkedArea[_tabBarIndex]["index"] = areaIndex;
//
//      // 将选中的内容作为标题显示
//      _myTabs[_tabBarIndex] = Tab(text: data["text"]);
//
//      // 修改tabbar选中的项下表
////      _tabBarIndex = _tabBarIndex + 1;
//
//      // 选择最后一项时，默认完成操作并关闭弹窗
//      if (_tabBarIndex > maxLen) {
//        _tabBarIndex = maxLen; // 不可去除，防止tab_controller.dart报错
//        widget.onConfirm(arrangementData());
//        Navigator.pop(context);
//      }
//
//      // 切换tabbar默认选中项
//      _tabController.animateTo(_tabBarIndex);
//
//      // 赋值列表内容
//      this.setListAndChangeTab(_tabBarIndex);
//    });

    // 内容置顶
    _controller.animateTo(0.0,
        duration: Duration(milliseconds: 100), curve: Curves.ease);
  }

  /// 修改tabitem中的内容
  /// * [tabBarIndex] int|必填|当前选中TabBar的索引
  void setListAndChangeTab(int tabBarIndex) {
    switch (tabBarIndex) {
      case 1:
        this.setState(() {
          _myTabs[1] = Tab(text: "请选择");
          _myTabs[2] = Tab(text: '');
        });
        break;
      case 2:
        this.setState(() {
          _myTabs[2] = Tab(text: "请选择");
        });
        break;
      case 3:
        this.setState(() {
          _myTabs[3] = Tab(text: "请选择");
        });
        break;
    }
  }

  /// 根据条件清空已选中的数据
  /// * [tabBarIndex] int|必填|当前选中TabBar的索引
  void emptyCheckedData(int tabBarIndex) {
    int startNum = tabBarIndex + 1;
    for (var i = startNum; i < checkedArea.length; i++) {
      setState(() {
        checkedArea[i] = {"text": null, "id": null, "index": -1, "level": null};
        _myTabs[i] = Tab(text: "");
      });
    }
  }

  /// 初始化组件
  void initPage() async {
    // 读取主题并赋值isLight
    String lsThemeType = await LocalStorage.getStringItem("theme");
    isLight = lsThemeType == "ThemeType.dark" ? false : true;
  }

  /// 渲染省市区的数据
  /// * [ct] context|必填|上下文
  ListView renderProvinceAndCity(ct) {
    // 执行创建省市区数据
    List data = createAreaData();

    // 返回ListView
    return ListView.builder(
      controller: _controller,
      itemExtent: 48.0,
      itemBuilder: (ct, i) {
        flag = data[i][widget.fieldNames["text"]] ==
            checkedArea[_tabBarIndex]["text"];
        return InkWell(
          child: Container(
            padding: EdgeInsets.symmetric(horizontal: ST.seth(30)),
            alignment: Alignment.centerLeft,
            child: Row(
              children: <Widget>[
                Visibility(
                  visible: flag,
                  child: Icon(
                    Icons.done,
                    color: SystemConfig.themeColor,
                    size: ST.setsp(40),
                  ),
                ),
                Text(
                  "${data[i][widget.fieldNames["text"]]}",
                  style: flag
                      ? TextStyle(
                          fontSize: ST.setsp(30),
                          color: SystemConfig.themeColor,
                        )
                      : null,
                ),
              ],
            ),
          ),
          onTap: () => checkedTab(i, data[i]),
        );
      },
      itemCount: data.length,
    );
  }

  /// 创建省市区数据
  List createAreaData({int level = 0}) {
    // 临时量initAreaData
    List _aTem = widget.initAreaData;
    int _a_level = checkedArea[0]["index"];
    int _b_level = checkedArea[1]["index"];
    int _c_level = checkedArea[2]["index"];

    // 定义返回的数据
    List areaDatas = [];

    //简化名称
    Map<String, dynamic> _s = widget.fieldNames;
    String _sc = widget.fieldNames["children"];

    switch (_tabBarIndex) {
      case 0:
        areaDatas = _aTem;
        break;
      case 1:
        areaDatas = _aTem[_a_level][_sc];
        break;
      case 2:
        areaDatas = _aTem[_a_level][_sc][_b_level][_sc].length > 0
            ? _aTem[_a_level][_sc][_b_level][_sc]
            : [];
        break;
      case 3:
        if (_aTem[_a_level][_sc][_b_level][_sc][_c_level][_sc].length > 0) {
          areaDatas = _aTem[_a_level][_sc][_b_level][_sc][_c_level][_sc];
        }
        break;
    }

    return areaDatas;
  }

  /// 剔除不符合条件的数据
  List arrangementData() {
    // 清空selectedOptions中的数据
    setState(() {
      selectedOptions = [];
    });

    // 检查及时更新模式是否开启widget.updateInTime
    if (widget.updateInTime) {
      checkedArea.forEach((e) {
        if (e["index"] >= 0) {
          selectedOptions.add(e);
        }
      });
    } else {
      // 检查第一项是否的index是否为-1
      if (checkedArea[0]["index"] >= 0) {
        // 默认将第一项插入到checkedArea
        selectedOptions.add(checkedArea[0]);

        // 遍历从checkedArea第一项开启检查数据是否符合条件
        for (int i = 0; i < checkedArea.length - 1; i++) {
          Map currentItem = checkedArea[i];
          Map nextItem = checkedArea[i + 1];

          String currentItemStr = currentItem["id"].substring(i * 2, i * 2 + 2);

          String nextItemStr;
          // 检查下一项中是否已存有数据
          if (nextItem["id"] != null && nextItem["id"].length > 1) {
            nextItemStr = nextItem["id"].substring(i * 2, i * 2 + 2);
          } else {
            continue;
          }

          // 检查下一项的index是否为-1
          if (nextItem["index"] >= 0) {
            if (currentItemStr == nextItemStr) {
              selectedOptions.add(nextItem);
            } else {
              continue;
            }
          } else {
            continue;
          }
        }
      }
    }

    // 返回的数据
    return selectedOptions;
  }
}
